package whsw;

import java.util.LinkedList;

/**
 * 步骤三: 定义命令行处理器的接口
 *
 * 把处理命令行这个功能进行抽象, 每一个功能就代表有一个实现类
 *
 * @author flutterdash@qq.com
 * @since 2021/6/20 13:39
 */
public interface CommandLineHandler {

    /**
     * 处理命令行
     *
     * @param command 用户在控制台用键盘输入的内容
     * @param employees 命令行处理逻辑需要对员工数据操作, 这里提供具有增删改查功能的对象
     * @throws Exception 允许处理命令行时抛出任意异常
     */
    void handle(String command, Employees employees) throws Exception;

    /**
     * 命令行处理程序的描述
     * 当在控制台中输入 help xxx 时, 这个方法会被调用
     * 命令行处理程序可以选择性覆盖这个方法
     *
     * @return 命令行的提示信息
     */
    default String help() {
        return "";
    }

    /**
     * 方便命令行处理的工具方法
     * 这个方法作用是把一个命令行字符串按照空格分隔, 并且剔除掉空白的内容
     * 保证返回的集合都是有效的数据
     *
     * 示例:
     * 用户输入 "help    insert"
     * 经过 split 处理后会变成 ["help", "", "", "", "insert"]
     * 这其中 下标为 1, 2, 3 的数组元素都是无效元素
     *
     * 过滤后 ["help", "insert"]
     *
     * @param cmd 用户在控制台用键盘输入的内容
     * @return 有效数据项组成的链表
     */
    default LinkedList<String> toList(String cmd) {
        String[] items = cmd.split(" ");
        LinkedList<String> result = new LinkedList<>();
        for (String item : items) {
            item = item.trim();
            if (!item.equals(""))
                result.add(item);
        }
        return result;
    }

    static void print(String str) {
        System.out.print(str);
    }

    static void println(String str) {
        System.out.println(str);
    }

    static void err(String str) {
        println(str);
    }

}
